package cn.iocoder.yudao.module.trade.controller.app.order.vo;

import com.alibaba.excel.annotation.format.DateTimeFormat;
import lombok.Data;
import org.springframework.web.bind.annotation.RequestParam;

import javax.validation.constraints.*;
import java.util.Date;

/**
 * @author chuhaifeng
 * @date 2025/4/19  22:05
 * @program ruoyi-vue-pro
 * @description 签证申请表基本信息数据传输对象
 *  所有字段均为必填项
 **/
@Data
public class PersonnelInfoBaseVO {

    @NotNull(message = "订单id不能为空")
    private Long tradeOrderId;

    @NotNull(message = "排序不能为空")
    private Integer sort;

    /**
     * 姓氏（中文）
     */
    @NotBlank(message = "姓氏不能为空")
    @Size(max = 50, message = "姓氏长度不能超过50个字符")
    private String familyName;

    /**
     * 姓氏拼音（大写）
     */
    @NotBlank(message = "姓氏拼音不能为空")
    @Pattern(regexp = "^[A-Z]+$", message = "姓氏拼音必须全部大写字母")
    @Size(max = 100, message = "姓氏拼音长度不能超过100个字符")
    private String familyNamePinyin;

    /**
     * 名字（中文）
     */
    @NotBlank(message = "名字不能为空")
    @Size(max = 50, message = "名字长度不能超过50个字符")
    private String givenName;

    /**
     * 名字拼音（大写）
     */
    @NotBlank(message = "名字拼音不能为空")
    @Pattern(regexp = "^[A-Z]+$", message = "名字拼音必须全部大写字母")
    @Size(max = 100, message = "名字拼音长度不能超过100个字符")
    private String givenNamePinyin;

    /**
     * 曾用名（如无请填写"无"）
     */
    @NotBlank(message = "曾用名不能为空，如无请填写'无'")
    @Size(max = 100, message = "曾用名长度不能超过100个字符")
    private String formerName;

    /**
     * 性别（MALE-男, FEMALE-女）
     */
    @NotBlank(message = "性别不能为空")
    @Pattern(regexp = "^(男|女)$", message = "性别必须为男或女")
    private String gender;

    /**
     * 出生日期（格式：yyyy-MM-dd）
     */
    @NotNull(message = "出生日期不能为空")
    @DateTimeFormat("yyyy-MM-dd")
    @Past(message = "出生日期必须是过去的时间")
    private Date birthDate;

    /**
     * 出生城市
     */
    @NotBlank(message = "出生城市不能为空")
    @Size(max = 100, message = "出生城市长度不能超过100个字符")
    private String birthCity;

    /**
     * 婚姻状况（SINGLE-未婚, MARRIED-已婚, DIVORCED-离异, WIDOWED-丧偶）
     */
    @NotBlank(message = "婚姻状况不能为空")
    @Pattern(regexp = "^(未婚|已婚|离异|丧偶)$",
            message = "婚姻状况必须为未婚、已婚、离异或丧偶")
    private String maritalStatus;

    /**
     * 身份证号码（18位）
     */
    @NotBlank(message = "身份证号码不能为空")
    @Size(min = 18, max = 18, message = "身份证号码必须为18位")
    private String idNumber;

    /**
     * 护照号码
     */
    @NotBlank(message = "护照号码不能为空")
    @Size(min = 8, max = 20, message = "护照号码长度必须在8到20个字符之间")
    private String passportNumber;

    /**
     * 护照签发地点
     */
    @NotBlank(message = "护照签发地点不能为空")
    @Size(max = 100, message = "护照签发地点长度不能超过100个字符")
    private String passportIssuePlace;

    /**
     * 护照签发日期（格式：yyyy-MM-dd）
     */
    @NotNull(message = "护照签发日期不能为空")
    @DateTimeFormat( "yyyy-MM-dd")
    @PastOrPresent(message = "护照签发日期必须是过去或当前时间")
    private Date passportIssueDate;

    /**
     * 护照有效期至（格式：yyyy-MM-dd）
     */
    @NotNull(message = "护照有效期不能为空")
    @DateTimeFormat( "yyyy-MM-dd")
    @Future(message = "护照有效期必须是未来时间")
    private Date passportExpiryDate;

    /**
     * 护照签发机关
     */
    @NotBlank(message = "护照签发机关不能为空")
    @Size(max = 100, message = "护照签发机关长度不能超过100个字符")
    private String passportAuthority;

    /**
     * 现居住地址（省市区）
     */
    @NotBlank(message = "现居住地址不能为空")
    @Size(max = 200, message = "现居住地址长度不能超过200个字符")
    private String currentAddress;

    /**
     * 详细地址（街道门牌号）
     */
    @NotBlank(message = "详细地址不能为空")
    @Size(max = 200, message = "详细地址长度不能超过200个字符")
    private String detailedAddress;

    /**
     * 手机号码（11位）
     */
    @NotBlank(message = "手机号码不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码格式不正确")
    private String mobileNumber;

    /**
     * 固定电话号码（如无请填写"无"）
     */
    @NotBlank(message = "固定电话不能为空，如无请填写'无'")
    @Size(max = 20, message = "固定电话号码长度不能超过20个字符")
    private String phoneNumber;

    /**
     * 电子邮箱
     */
    @NotBlank(message = "电子邮箱不能为空")
    @Email(message = "电子邮箱格式不正确")
    @Size(max = 100, message = "电子邮箱长度不能超过100个字符")
    private String email;

    /**
     * 职业状况
     */
    @NotBlank(message = "职业状况不能为空")
    @Pattern(regexp = "^(在职|无业|学生|退休|其他)$",
            message = "职业状况必须为在职、无业、学生、退休或其他")
    private String occupationStatus;

}
